package main

type Student struct {
	Name string
}

func foo() *int {
	var m1 int = 11
	var m2 = &Student{
		Name: "zhanglin",
	}
	var ch = make(chan *Student, 1)
	ch <- m2
	var m3 int = 13
	println(&m1, m2, &m3)
	return &m3
}

func main() {
	m := foo()
	println(m)
}

// go build -gcflags '-m -l' escape.go
// # command-line-arguments
//./escape.go:12:6: moved to heap: m3
//./escape.go:9:11: &Student{...} does not escape
// 可以看到m1、m2作为函数内部的变量没有离开它的作用域，即没有逃逸，会被分配到栈，而m3逃逸了,因为它
// 作为函数返回值被其他地方调用，并且为指针类型，因此会被分配到堆
// 如果m3为值类型，不会逃逸
